//
// MarshalDesc.cs
//
// Author:
//   Jb Evain (jbevain@gmail.com)
//
// (C) 2005 Jb Evain
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//

namespace Mono.Cecil {

	using System;

	public class MarshalInfo {

		NativeType native;

		public NativeType NativeIntrinsic {
			get { return native; }
			set { native = value; }
		}

		public MarshalInfo (NativeType natIntr)
		{
			native = natIntr;
		}
	}

	public sealed class ArrayMarshalInfo : MarshalInfo {

		NativeType element_type;
		int m_paramNum;
		int m_elemMult;
		int m_numElem;

		public NativeType ElementType {
			get { return element_type; }
			set { element_type = value; }
		}

		public int ParamNum {
			get { return m_paramNum; }
			set { m_paramNum = value; }
		}

		public int ElemMult {
			get { return m_elemMult; }
			set { m_elemMult = value; }
		}

		public int NumElem {
			get { return m_numElem; }
			set { m_numElem = value; }
		}

		public ArrayMarshalInfo ()
			: base (NativeType.ARRAY)
		{
		}
	}

	public sealed class CustomMarshalerInfo : MarshalInfo {

		Guid guid;
		string unmanaged_type;
		TypeReference managed_type;
		string cookie;

		public Guid Guid {
			get { return guid; }
			set { guid = value; }
		}

		public string UnmanagedType {
			get { return unmanaged_type; }
			set { unmanaged_type = value; }
		}

		public TypeReference ManagedType {
			get { return managed_type; }
			set { managed_type = value; }
		}

		public string Cookie {
			get { return cookie; }
			set { cookie = value; }
		}

		public CustomMarshalerInfo ()
			: base (NativeType.CUSTOMMARSHALER)
		{
		}
	}

	public sealed class SafeArrayInfo : MarshalInfo {

		VariantType element_type;

		public VariantType ElementType {
			get { return element_type; }
			set { element_type = value; }
		}

		public SafeArrayInfo ()
			: base (NativeType.SAFEARRAY)
		{
		}
	}

	public sealed class FixedArrayInfo : MarshalInfo {

		int m_numElem;
		NativeType element_type;

		public int NumElem {
			get { return m_numElem; }
			set { m_numElem = value; }
		}

		public NativeType ElementType {
			get { return element_type; }
			set { element_type = value; }
		}

		public FixedArrayInfo ()
			: base (NativeType.FIXEDARRAY)
		{
		}
	}

	public sealed class FixedSysStringInfo : MarshalInfo {

		int size;

		public int Size {
			get { return size; }
			set { size = value; }
		}

		public FixedSysStringInfo ()
			: base (NativeType.FIXEDSYSSTRING)
		{
		}
	}
}
